package main

import (
	"fmt"
	"reflect"
)

func main() {

	// 初始化测试用例
	t := T{12, "someone-life", nil, TT{}}

	typeOf := reflect.TypeOf(t)

	s := reflect.ValueOf(&t).Elem() // 反射获取测试对象对应的struct枚举类型

	s.Field(0).SetInt(123) // 内置常用类型的设值方法，利用Field序号get

	fieldNum := typeOf.NumField()

	for i := 0; i < fieldNum; i++ {
		field := typeOf.Field(i)
		fmt.Println(i, field.Name, field.Anonymous, field.Tag.Get("name"), field.Tag.Get("a"))
	}

	sliceValue := reflect.ValueOf([]int{1, 2, 3}) // 这里将slice转成reflect.Value类型; 用于下一步赋值

	s.FieldByName("Children").Set(sliceValue) // 使用字段名称get，并赋值。赋值类型必须为reflect.Value

	s.FieldByName("TT").Set(reflect.ValueOf(TT{}))

	fmt.Println(t)

	Print := reflect.ValueOf(&t).MethodByName("Print")

	fmt.Println("fv is reflect.Func ?", Print.Kind() == reflect.Func, Print.Kind())

	Print.Call(nil)
}

//定义struct
type T struct {
	Age      int    `name:"年龄" a:"aa"`
	Name     string `name:"名字" a:"aa"`
	Children []int  `name:"子类" a:"aa"`
	TT       `name:"tt"`
}

type TT struct {
}

func (t *T) Print() () {

	fmt.Println("t::", t)
}
